import axios from 'axios';
import { errorCodeType } from './error-code-type';

let baseURL = import.meta.env.VITE_APP_DEV_URL;
if (process.env.NODE_ENV !== 'development') {
  const matches = window.location.hostname.match(/^(.+?-)(.+?)(\..+)$/) || [];
  /* baseURL = `${window.location.protocol}//${matches[1]}api${matches[3]}/${matches[2].replace(/\-/g, '_')}/` */
  baseURL = `${window.location.protocol}//${matches[1]}api${matches[3]}/`;
  console.log('当前网址：', baseURL);
}
// 创建axios实例
const service = axios.create({
  // 服务接口请求
  baseURL: baseURL,
  // 超时设置
  // timeout: 15000,
  headers: { 'Content-Type': 'application/json;charset=utf-8' },
});

// 请求拦截
service.interceptors.request.use(
  (config) => {
    // 在发送请求之前做些什么
    return config;
  },
  (error) => {
    console.log(error);
    Promise.reject(error);
  },
);
// 响应拦截器
service.interceptors.response.use(
  (res: any) => {
    // 未设置状态码则默认成功状态
    const code = res.data['code'] || 200;
    // 获取错误信息
    errorCodeType(code, res.msg) || res.data['msg'] || errorCodeType(-999, res.msg);
    if (code === 200) {
      return Promise.resolve(res.data);
    } else {
      return Promise.reject(res.data);
    }
  },
  (error) => {
    console.log('err' + error);
    const { response } = error;

    if (response) {
      // 请求已发出，但是不在2xx的范围 调用错误处理的方法（把状态码，错误的提示信息传进去）
      errorCodeType(response.status, response.data.message);
      return Promise.reject(response);
    } else {
      // 超时提示
      if (error.message.includes('timeout')) {
        return Promise.reject(error);
      }
      /* 处理断网的情况
								eg: 请求超时或断网时，更新 state 的 network 状态
								network 状态在 app.vue 中控制着一个全局的断网提示组件的显示隐藏
								关于断网组件中的刷新重新获取数据，会在断网组件中说明 */
      if (!window.navigator.onLine) {
        // 如果断网....
        // store.commit('changeNetwork', false);
      } else {
        return Promise.reject(error);
      }
    }
  },
);
// 封装一个request方法
function request(url: string, method: string, data?: object) {
  return service({
    url: baseURL + url,
    method,
    params: method == 'get' ? data : '',
    data: method == 'post' ? JSON.stringify(data) : '',
  });
}

// public公开的,意思就是让别人用  private自己封装的 需要隐藏起来 不让别人用
// 封装get方法
const http = {
  get: (url: string, data?: any) => request(url, 'get', data),
  // 封装post方法
  post: (url: string, data: any) => request(url, 'post', data),
};
export default http;
